/**
 * @file main.cpp
 * @brief 网格属性插值程序的主入口
 * 
 * 程序功能：
 * 1. 在两个不同网格之间进行属性插值
 * 2. 支持杨氏模量和泊松比的插值
 * 3. 使用KD树优化的最近邻搜索
 * 4. 并行计算和SIMD优化
 */

#define NOMINMAX  // 防止Windows头文件中的min/max宏干扰std::min/max
#ifdef _WIN32
#include <windows.h>
#endif

#include <iostream>
#include "MeshProcessor.h"

/**
 * @brief 程序入口函数
 * @return 成功返回0，失败返回1
 * 
 * 主要执行流程：
 * 1. 配置K近邻搜索参数
 * 2. 设置输入输出文件路径
 * 3. 创建并运行网格处理器
 * 4. 异常处理和错误报告
 */
int main(void)
{
    try
    {
        // 配置K近邻搜索，使用8个最近邻点进行插值
        // 该值影响插值结果的精度和计算性能
        const size_t k_nearest = 20;
        MeshProcessor::setKNearestPoints(k_nearest);

        // 设置输入输出文件路径
        // 所有路径都相对于当前目录
        std::string current_dir = ".";
        std::string grid_a_file = current_dir + "/q1/input/Grid_A.out";    // 源网格文件
        std::string grid_b_file = current_dir + "/q1/input/Grid_B.out";    // 目标网格文件
        std::string props_a_file = current_dir + "/q1/input/A_porps.txt";  // 源网格属性文件
        std::string output_file = current_dir + "/q1/output/B_porps.txt";  // 输出结果文件

        // 创建网格处理器实例并执行处理
        // 处理器会自动进行内存管理和资源清理
        MeshProcessor processor(grid_a_file, grid_b_file,
                              props_a_file, output_file);
        processor.process();

        return 0;
    }
    catch (const std::exception &e)
    {
        // 捕获并报告所有异常
        // 使用cerr输出错误信息到标准错误流
        std::cerr << "错误: " << e.what() << std::endl;
        return 1;
    }
}